package cn.dapeng.designPatterns.prototype;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

/**
 * 对象的拷贝需要实现Cloneable接口，它是一个标记接口
 * 如果对象是通过对象流创建的，还需要实现Serializable接口，它也是一个标记接口
 *
 *
 * 标记接口，什么都不做，不需要实现任何方法
 *
 */

/**
 * @BelongProject study
 * @BelongPackage cn.dapeng.designPatterns.prototype
 * @Description TODO
 * @ClassName PrototypeTest
 * @Author xupenghong
 * @Date 2024/8/21 10:30
 * @Version 1.0.0
 */
public class PrototypeTest {


    public static Student createStudent() {
        Student student = new Student();

        student.setAge(11);
        student.setName("dapeng");

        Address address = new Address();
        address.setProvince("beijing");
        address.setCity("haidian");

        student.setAddress(address);
        return student;
    }

    /**
     * 第一种和第三种创建对象的方法，代码内容是相同的，区别在与Student类中的clone方法
     * 浅拷贝只克隆当前类，类成员变量不做拷贝
     * 深拷贝把类中的成员变量也做了拷贝
     *
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {
        Student student = createStudent();

        //浅拷贝
//        Student cloneStudent = student.clone();

        // 深拷贝一
//        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("a.txt"));
//        oos.writeObject(student);
//
//        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("a.txt"));
//        Student cloneStudent = (Student) ois.readObject();

        //深拷贝二

        Student cloneStudent = student.clone();

        cloneStudent.setName("haha");
        cloneStudent.getAddress().setCity("shangdi");
        System.out.println(student + " = " + cloneStudent);




    }
}
